import Crypto.PublicKey.RSA 
import Crypto.Signature.pkcs1_15
#PKCS1_v1_5是一种密码学模块，它是基于RSA算法实现的加密和签名标准。该标准定义了使用RSA算法进行数据加密和数字签名的方法，并提供了一种安全的数据传输方法。
# import Crypto.Cipher.PKCS1_v1_5
import Crypto.Random
import Crypto.Hash.SHA256
#SHA2包含SHA256,用这个正好

def gen_rsa_key(pri_url,pub_url):
    #pri_url=url+"a.pem"
    #pub_url=url+"b.pem"
    key=Crypto.PublicKey.RSA.generate(2048,Crypto.Random.new().read)#生成RSA密钥函数
    private_key=key.export_key()#密钥对象转换为字符串对象
    public_key=key.publickey().export_key()
    with open(pri_url,"wb") as f:
        f.write(private_key)
    f.close()
    print("private_key:",private_key)
    with open(pub_url,"wb") as f:
        f.write(public_key)
    f.close
    print("public_key:",public_key)


def rsa_sign(plaintext,key,hash_algorithm=Crypto.Hash.SHA256):
    signer = Crypto.Signature.pkcs1_15.new(Crypto.PublicKey.RSA.import_key(key))#创建签名实例的函数，用于生成一个签名对象，以便进行数字签名和签名验证操作。
    #此处可以添加数字签名的原文信息，例如签名者，发布时间等
    #hash算法只能使用pycrypto库的hash算法，其他不行
    hash_value=hash_algorithm.new(plaintext)#对原文进行hash处理
    return signer.sign(hash_value)

def rsa_verify(sgin,plaintext,key,hash_algorithm=Crypto.Hash.SHA256):
    hash_value=hash_algorithm.new(plaintext)#对原文进行hash
    verifier= Crypto.Signature.pkcs1_15.new(Crypto.PublicKey.RSA.import_key(key))#签名验证也需要创建一个签名实例函数
    try:
        verifier.verify(hash_value,sgin)#查看证书与加密前是否一致
        return True
    except(ValueError,TypeError):
        return False

#输入文件转化为bytes
def exp_file(filename):
    with open(filename,"rb") as f:
        file_text_bytes= f.read()
    return file_text_bytes



#gen_rsa_key("D:\\")
# with open("D://a.txt","rb")as f:
#     plaintext=f.read()
# f.close()
# with open("D://a.pem","rb")as x:
#     private_key=x.read()
#     signature=rsa_sign(plaintext,private_key)#私钥加密创建证书(其实正反都行)
#     print("signature:",signature)
# x.close()
# with open("D://sign.txt","wb")as sign:
#     sign.write(signature)
# sign.close()
# with open("D://b.pem","rb")as y:
#     public_key=y.read()
#     result=rsa_verify(signature,plaintext,public_key)#共钥解密验证证书
#     print("result:",result)


#本来想加入类似于有效期的东西，但是Crypto.Signature内置几种签名算法函数有且只有几个基础方法(sgin，new，can_sgin,verify)且都不支持，所以就这样了
#https://pycryptodome.readthedocs.io/en/latest/src/signature/pkcs1_v1_5.html#Crypto.Signature.pkcs1_15.new